#include"BlockQueue.hpp"
#include"task.hpp"

template<typename T>
void* Consumer(void* input)
{
    auto* p = static_cast<BlockQueue<T>*>(input);
    while(true)
    {
        sleep(3);
        auto ret = p->Consume();
        //ret();
        ret.DownLoad();
        std::cout << "一整次消费完成" << std::endl;
    }
}

void func()
{
    std::cout << "我是一个回调函数" << std::endl;
}

template<typename T>
void* Produer(void* input)
{
    auto* p = static_cast<BlockQueue<T>*>(input);
    while(true)
    {
        //p->Produce(1);

        // p->Produce([](){
        //     std::cout << "我是一个lambda表达式" << std::endl; 
        // });

        //p->Produce(func);       
        myTask mt;
        p->Produce(mt); 
        std::cout << "一整次生产完成" << std::endl;
    }

}

int main()
{
    BlockQueue<myTask>* bq = new BlockQueue<myTask>;

    pthread_t c1,c2,c3;
    pthread_t p1,p2;
    //仨消费者
    pthread_create(&c1,nullptr,Consumer<myTask>,(void*)(bq));
    pthread_create(&c3,nullptr,Consumer<myTask>,(void*)(bq));
    pthread_create(&c2,nullptr,Consumer<myTask>,(void*)(bq));

    //俩生产者
    pthread_create(&p1,nullptr,Produer<myTask>,(void*)(bq));
    pthread_create(&p2,nullptr,Produer<myTask>,(void*)(bq));

    //-----------------------------传递回调函数
    // BlockQueue<func_t>* bq = new BlockQueue<func_t>;

    // pthread_t c1,c2,c3;
    // pthread_t p1,p2;
    // //仨消费者
    // pthread_create(&c1,nullptr,Consumer<func_t>,(void*)(bq));
    // pthread_create(&c3,nullptr,Consumer<func_t>,(void*)(bq));
    // pthread_create(&c2,nullptr,Consumer<func_t>,(void*)(bq));

    // //俩生产者
    // pthread_create(&p1,nullptr,Produer<func_t>,(void*)(bq));
    // pthread_create(&p2,nullptr,Produer<func_t>,(void*)(bq));

    //-----------------------------传递普通变量
    // BlockQueue<int>* bq = new BlockQueue<int>;

    // pthread_t c1,c2,c3;
    // pthread_t p1,p2;
    // //仨消费者
    // pthread_create(&c1,nullptr,Consumer<int>,(void*)(bq));
    // pthread_create(&c3,nullptr,Consumer<int>,(void*)(bq));
    // pthread_create(&c2,nullptr,Consumer<int>,(void*)(bq));

    // //俩生产者
    // pthread_create(&p1,nullptr,Produer<int>,(void*)(bq));
    // pthread_create(&p2,nullptr,Produer<int>,(void*)(bq));

    int cnt = 10;
    while(cnt--){sleep(1);} //让子线程运行10秒

    pthread_join(c1,nullptr);
    pthread_join(c2,nullptr);
    pthread_join(c3,nullptr);
    pthread_join(p1,nullptr);
    pthread_join(p2,nullptr);
    delete bq;
    return 0;
}